.text
.section .rodata
.text
.globl main
.type main, @function
main:
    addi sp, sp, -32
    sd ra, 24(sp)
    sd s0, 16(sp)

    addi s0, sp, 16

    // 这里偷了一下懒，把sp直接作为第一个参数，因为只有一个局部变量，也无所谓了
    mv a0, sp
    li a1, 10
    call s_gets

    mv a0, sp
    call puts

    ld ra, 24(sp)
    ld s0, 16(sp)
    addi sp, sp, 32
    jr ra

.text
.globl s_gets
.type s_gets, @function
.text
.globl s_gets
.type s_gets, @function
s_gets:
    addi sp, sp, -48
    sd ra, 40(sp)
    sd s0, 32(sp)
    addi s0, sp, 32

    // 根据x86的经验，就不存参数了，按照通用的规矩是要存的
    // ret_val: -8(s0)
    // i: -12(s0)

    // 不行，不存参数是不行的，因为调用fgets后，返回值会把a0覆盖了。
    // st:-20(s0)
    // n: -24(s0)
    sd a0, -20(s0) /* st */
    sw a1, -24(s0) /* n */
    sw zero, -12(s0) /* i */

    // 以下两行实际不需要，不过协助这里，万一中间插了代码把a0和a1覆盖了呢
    ld a0, -20(s0) /* st */
    lw a1, -24(s0) /* n */
    lui a5, %hi(stdin)
    ld a2, %lo(stdin)(a5)
    call fgets

    sd a0, -8(s0) /* ret_val */
    beq a0, zero, .EXIT

    j .WHILE_15_COMPARE
.WHILE_15_ENTER:
    lw a5, -12(s0) /* i */
    addiw a5, a5, 1
    sw a5, -12(s0) /* i */
.WHILE_15_COMPARE:
    lw a5, -12(s0) /* i */
    sext.w a5, a5
    ld a4, -20(s0) /* st */
    add a5, a4, a5
    lbu a5, (a5)
    li a4, 10
    beq a5, a4, .IF_17
    bne a5, zero, .WHILE_15_ENTER
.IF_17:
    lw a5, -12(s0) /* i */
    sext.w a5, a5
    ld a4, -20(s0) /* st */
    add a5, a4, a5
    lbu a6, (a5)
    li a4, 10
    bne a6, a4, .WHILE_20_ENTER
    sb zero, (a5)
    j .EXIT
.WHILE_20_ENTER:
    call getchar
    li a5, 10
    bne a0, a5, .WHILE_20_ENTER
.EXIT:
    ld a0, -8(s0) /* ret_val */
    ld ra, 40(sp)
    ld s0, 32(sp)
    addi sp, sp, 48
    jr ra